//package personal;
//
//import exceptions.IllegalDecimalException;
//import exceptions.IllegalIdentifierException;
//import personal.scanner.SimpleScanner;
//import personal.parser.Grammar;
//import personal.parser.SimpleGrammar;
//import personal.scanner.ScannerFiniteAutomata;
//
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//
///**
// * 构造器，通过给出的字面量进行构造
// */
//public interface Maker {
//
//    static Grammar makeParserGrammarTest() {
//        List<String> nonTerminalSymbolExpressions = new ArrayList<>(Arrays.asList("Expr", "ArithExpr", "BoolExpr", "UnaryFunc", "VariablFunc", "ArithExprList"));
//        List<String> terminalSymbolExpressions = new ArrayList<>(Arrays.asList(
//                "decimal", "(", ")",
//                "算术运算",
//                "-",
//                "?", ":", ",",
//                "三角函数",
//                "最值函数",
//                "布尔常量",
//                "比较运算",
//                "二元逻辑运算",
//                "!"
//        ));
//        Grammar grammar = new SimpleGrammar("Expr", nonTerminalSymbolExpressions, terminalSymbolExpressions, "  ",
//                "Expr  ArithExpr",
//                "ArithExpr  decimal",
//                "ArithExpr  (  ArithExpr  )",
//                "ArithExpr  ArithExpr  算术运算  ArithExpr",
//                "ArithExpr  -  ArithExpr",
//                "ArithExpr  BoolExpr  ?  ArithExpr  :  ArithExpr",
//                "ArithExpr  UnaryFunc",
//                "ArithExpr  VariablFunc",
//                "UnaryFunc  三角函数  (  ArithExpr  )",
//                "VariablFunc  最值函数  (  ArithExpr  ,  ArithExprList  )",
//                "ArithExprList  ArithExpr",
//                "ArithExprList  ArithExpr  ,  ArithExprList",
//                "BoolExpr  布尔常量",
//                "BoolExpr  (  BoolExpr  )",
//                "BoolExpr  ArithExpr  比较运算  ArithExpr",
//                "BoolExpr  BoolExpr  二元逻辑运算  BoolExpr",
//                "BoolExpr  !  BoolExpr"
//        );
//        return grammar;
//    }
//
//    /**
//     * 构造文法
//     */
//    static Grammar makeParserGrammar() {
//        List<String> nonTerminalSymbolExpressions = new ArrayList<>(Arrays.asList("Expr", "ArithExpr", "BoolExpr", "UnaryFunc", "VariablFunc", "ArithExprList"));
//        List<String> terminalSymbolExpressions = new ArrayList<>(Arrays.asList(
//                "decimal", "(", ")", "+", "-", "*", "/", "^", "?", ":", ",",
//                "sin", "cos", "max", "min", "true", "false",
//                ">", ">=", "<", "<=", "=", "<>", "&", "|", "!"
//        ));
//        Grammar grammar = new SimpleGrammar("Expr", nonTerminalSymbolExpressions, terminalSymbolExpressions, "  ",
//                "Expr  ArithExpr",
//                "ArithExpr  decimal",
//                "ArithExpr  (  ArithExpr  )",
//                "ArithExpr  ArithExpr  +  ArithExpr",
//                "ArithExpr  ArithExpr  -  ArithExpr",
//                "ArithExpr  ArithExpr  *  ArithExpr",
//                "ArithExpr  ArithExpr  /  ArithExpr",
//                "ArithExpr  ArithExpr  ^  ArithExpr",
//                "ArithExpr  -  ArithExpr",
//                "ArithExpr  BoolExpr  ?  ArithExpr  :  ArithExpr",
//                "ArithExpr  UnaryFunc",
//                "ArithExpr  VariablFunc",
//                "UnaryFunc  sin  (  ArithExpr  )",
//                "UnaryFunc  cos  (  ArithExpr  )",
//                "VariablFunc  max  (  ArithExpr  ,  ArithExprList  )",
//                "VariablFunc  min  (  ArithExpr  ,  ArithExprList  )",
//                "ArithExprList  ArithExpr",
//                "ArithExprList  ArithExpr  ,  ArithExprList",
//                "BoolExpr  true",
//                "BoolExpr  false",
//                "BoolExpr  (  BoolExpr  )",
//                "BoolExpr  ArithExpr  >  ArithExpr",
//                "BoolExpr  ArithExpr  >=  ArithExpr",
//                "BoolExpr  ArithExpr  <  ArithExpr",
//                "BoolExpr  ArithExpr  <=  ArithExpr",
//                "BoolExpr  ArithExpr  =  ArithExpr",
//                "BoolExpr  ArithExpr  <>  ArithExpr",
//                "BoolExpr  BoolExpr  &  BoolExpr",
//                "BoolExpr  BoolExpr  |  BoolExpr",
//                "BoolExpr  !  BoolExpr"
//        );
//        return grammar;
//    }
//
//
//    /**
//     * 构造词法分析器
//     *
//     * @return dfa
//     */
//    static ScannerFiniteAutomata makeScannerDFA() {
////        SimpleScannerDFA dfa = new SimpleScannerDFA(1, "  ",
////                "1  2  0  1  2  3  4  5  6  7  8  9",
////                "2  2  0  1  2  3  4  5  6  7  8  9",
////                "2  3  E  e",
////                "2  5  .",
////                "5  6  0  1  2  3  4  5  6  7  8  9",
////                "6  6  0  1  2  3  4  5  6  7  8  9",
////                "6  3  E  e",
////                "3  4  0  1  2  3  4  5  6  7  8  9",
////                "3  7  +  -",
////                "7  4  0  1  2  3  4  5  6  7  8  9",
////                "4  4  0  1  2  3  4  5  6  7  8  9",
////
////                "1  8  t",
////                "8  9  r",
////                "9  10  u",
////                "10  11  e",
////                "1  12  f",
////                "12  13  a",
////                "13  14  l",
////                "14  10  s",
////
////                "1  16  !  &  (  )  *  +  ,  -  /  :  |  =  ^  ?",
////                "1  15  >",
////                "15  16  =",
////                "1  17  <",
////                "17  16  =  >",
////
////                "1  18  s",
////                "18  19  i",
////                "19  20  n",
////                "1  21  m",
////                "21  19  i",
////                "21  22  a",
////                "22  20  x",
////                "1  23  c",
////                "23  24  o",
////                "24  20  s"
////        );
//        ScannerFiniteAutomata dfa = new ScannerFiniteAutomata();
//        dfa.setStartId(1);
//
//        addTransit(dfa, 1, 2, "0 1 2 3 4 5 6 7 8 9");
//        addTransit(dfa, 2, 2, "0 1 2 3 4 5 6 7 8 9");
//        addTransit(dfa, 2, 3, "E e");
//        addTransit(dfa, 2, 5, ".");
//        addTransit(dfa, 5, 6, "0 1 2 3 4 5 6 7 8 9");
//        addTransit(dfa, 6, 6, "0 1 2 3 4 5 6 7 8 9");
//        addTransit(dfa, 6, 3, "E e");
//        addTransit(dfa, 3, 4, "0 1 2 3 4 5 6 7 8 9");
//        addTransit(dfa, 3, 7, "+ -");
//        addTransit(dfa, 7, 4, "0 1 2 3 4 5 6 7 8 9");
//        addTransit(dfa, 4, 4, "0 1 2 3 4 5 6 7 8 9");
//
//        addTransit(dfa, 1, 8, "t");
//        addTransit(dfa, 8, 9, "r");
//        addTransit(dfa, 9, 10, "u");
//        addTransit(dfa, 10, 11, "e");
//        addTransit(dfa, 1, 12, "f");
//        addTransit(dfa, 12, 13, "a");
//        addTransit(dfa, 13, 14, "l");
//        addTransit(dfa, 14, 10, "s");
//
//        addTransit(dfa, 1, 16, "! & ( ) * + , - / : | = ^ ?");
//        addTransit(dfa, 1, 15, ">");
//        addTransit(dfa, 15, 16, "=");
//        addTransit(dfa, 1, 17, "<");
//        addTransit(dfa, 17, 16, "= >");
//
//        addTransit(dfa, 1, 18, "s");
//        addTransit(dfa, 18, 19, "i");
//        addTransit(dfa, 19, 20, "n");
//        addTransit(dfa, 1, 21, "m");
//        addTransit(dfa, 21, 19, "i");
//        addTransit(dfa, 21, 22, "a");
//        addTransit(dfa, 22, 20, "x");
//        addTransit(dfa, 1, 23, "c");
//        addTransit(dfa, 23, 24, "o");
//        addTransit(dfa, 24, 20, "s");
//
//        dfa.registerAcceptableNode(2, SimpleScanner.AcceptType.DECIMAL.ordinal());
//        dfa.registerAcceptableNode(4, SimpleScanner.AcceptType.DECIMAL.ordinal());
//        dfa.registerAcceptableNode(6, SimpleScanner.AcceptType.DECIMAL.ordinal());
//        dfa.registerAcceptableNode(11, SimpleScanner.AcceptType.DECIMAL.ordinal());
//
//        dfa.registerAcceptableNode(15, SimpleScanner.AcceptType.SYMBOL.ordinal());
//        dfa.registerAcceptableNode(16, SimpleScanner.AcceptType.SYMBOL.ordinal());
//        dfa.registerAcceptableNode(17, SimpleScanner.AcceptType.SYMBOL.ordinal());
//
//        dfa.registerAcceptableNode(20, SimpleScanner.AcceptType.IDENTIFIER.ordinal());
//
//
//        dfa.initTransitionTable();
//
//        dfa.nodeDefaultExceptions.putIfAbsent(1, IllegalIdentifierException.class); // 开头就错，说明是非法字符
//        // 错误的运算数字
//        dfa.nodeDefaultExceptions.putIfAbsent(3, IllegalDecimalException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(5, IllegalDecimalException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(7, IllegalDecimalException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(8, IllegalDecimalException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(9, IllegalDecimalException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(10, IllegalDecimalException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(12, IllegalDecimalException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(13, IllegalDecimalException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(14, IllegalDecimalException.class);
//        // 错误的标识符
//        dfa.nodeDefaultExceptions.putIfAbsent(18, IllegalIdentifierException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(19, IllegalIdentifierException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(21, IllegalIdentifierException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(22, IllegalIdentifierException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(23, IllegalIdentifierException.class);
//        dfa.nodeDefaultExceptions.putIfAbsent(24, IllegalIdentifierException.class);
//
//        return dfa;
//    }
//
//    /**
//     * 对指定 dfa 添加 u-v 的转移，转移集合通过字符串给出，以空格分割
//     *
//     * @param dfa         指定 dfa
//     * @param u           转移起点
//     * @param v           转移终点
//     * @param transitions 转移集合
//     */
//    private static void addTransit(ScannerFiniteAutomata dfa, int u, int v, String transitions) {
//        for (String tmp : transitions.split(" ")) {
//            int transition = tmp.charAt(0);
//            dfa.addEdge(u, v, transition);
//            dfa.transitions.add(transition);
//        }
//    }
//
//
//}
